#pragma once
#include "track.hpp"
#include <vector>



class RouteItem {
public:
    RouteItem(Track *track, DIRECTION direction)
        : track(track), direction(direction) {}

    Track *track;
    DIRECTION direction;
};

class Route {
public:
    fp_type distance;     // 行驶过的距离
    fp_type headPosition; // 车头在车头所在区间的位置(m)
    fp_type tailPosition; // 车尾在车尾所在区间的位置(m)
    Route(std::vector<Track *> tracks, std::vector<DIRECTION> directions,
          int tracksNum);
    ~Route();
    inline int getTracksNum() { return tracksNum; };
    // 获取当前的车头所在的路径项RouteItem
    // 如果越界，返回nullptr
    inline RouteItem *getCurrentRouteItem() {
        return headIndex < items.size() ? (&items[headIndex]) : nullptr;
    };
    // 获取当前的车头所在的路径项RouteItem
    // 如果越界，返回nullptr
    inline RouteItem *getCurrentTailRouteItem() {
        return tailIndex < items.size() ? (&items[tailIndex]) : nullptr;
    };
    // 获取车头距离区间终点的距离
    fp_type getDistanceToTerminal() ;
    int getHeadIndex() { return this->headIndex; }
    int getTailIndex() { return this->tailIndex; }
    void incHeadIndex() { this->headIndex++; };
    void incTailIndex() { this->tailIndex++; };
    std::vector<RouteItem> items; // 路径的每一项

private:
    int tracksNum; // 路径的区间数量
    int headIndex; // 车头位于的区间序号（不是区间id）
    int tailIndex; // 车尾位于的区间序号（不是区间id）
};
